{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 300,
   "id": "e13e8119ae2cef97",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:09.597539500Z",
     "start_time": "2024-09-20T12:37:09.507404100Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "        user_id  merchant_id  label\n218931   399620          310      0\n252868   183656         3129      0\n39752    214005         3609      0\n209917    76778         2824      0\n128527   258043         4760      1",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>218931</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>252868</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>39752</th>\n      <td>214005</td>\n      <td>3609</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>209917</th>\n      <td>76778</td>\n      <td>2824</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>128527</th>\n      <td>258043</td>\n      <td>4760</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 300,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "train_df = pd.read_csv('train_format1.csv')\n",
    "# 随机采样\n",
    "sample_fraction = 0.2  # 采样比例\n",
    "train_df = train_df.sample(frac=sample_fraction, random_state=42)\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "user_id        0\nmerchant_id    0\nlabel          0\ndtype: int64"
     },
     "execution_count": 301,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看空值数\n",
    "train_df.isnull().sum()"
   ],
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:09.624674800Z",
     "start_time": "2024-09-20T12:37:09.598535900Z"
    }
   },
   "id": "initial_id",
   "execution_count": 301
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "   user_id  age_range  gender\n0   376517        6.0     1.0\n1   234512        5.0     0.0\n2   344532        5.0     0.0\n3   186135        5.0     0.0\n4    30230        5.0     0.0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>age_range</th>\n      <th>gender</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>376517</td>\n      <td>6.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>234512</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>344532</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>186135</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>30230</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 302,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_info = pd.read_csv('user_info_format1.csv')\n",
    "user_info.head()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:09.710478Z",
     "start_time": "2024-09-20T12:37:09.603745100Z"
    }
   },
   "id": "7c505ffe7d7cbf66",
   "execution_count": 302
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "user_id         0\nage_range    2217\ngender       6436\ndtype: int64"
     },
     "execution_count": 303,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看空值数\n",
    "user_info.isnull().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:09.710478Z",
     "start_time": "2024-09-20T12:37:09.670698900Z"
    }
   },
   "id": "b1459d1dc784f46a",
   "execution_count": 303
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "          user_id  item_id  cat_id  seller_id  brand_id  time_stamp  \\\n7282274    355810   544157     648        333    1121.0         907   \n50654831   321524   873572    1308        452    6701.0        1019   \n41751266   301525   594180     730       4966    3467.0        1110   \n32302070     1938   250117     884       2084    8194.0         522   \n11596581   370579   617098    1553       3760    3738.0        1105   \n\n          action_type  \n7282274             0  \n50654831            2  \n41751266            0  \n32302070            2  \n11596581            0  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>item_id</th>\n      <th>cat_id</th>\n      <th>seller_id</th>\n      <th>brand_id</th>\n      <th>time_stamp</th>\n      <th>action_type</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>7282274</th>\n      <td>355810</td>\n      <td>544157</td>\n      <td>648</td>\n      <td>333</td>\n      <td>1121.0</td>\n      <td>907</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>50654831</th>\n      <td>321524</td>\n      <td>873572</td>\n      <td>1308</td>\n      <td>452</td>\n      <td>6701.0</td>\n      <td>1019</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>41751266</th>\n      <td>301525</td>\n      <td>594180</td>\n      <td>730</td>\n      <td>4966</td>\n      <td>3467.0</td>\n      <td>1110</td>\n      <td>0</td>\n    </tr>\n    <tr>\n      <th>32302070</th>\n      <td>1938</td>\n      <td>250117</td>\n      <td>884</td>\n      <td>2084</td>\n      <td>8194.0</td>\n      <td>522</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>11596581</th>\n      <td>370579</td>\n      <td>617098</td>\n      <td>1553</td>\n      <td>3760</td>\n      <td>3738.0</td>\n      <td>1105</td>\n      <td>0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 304,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_log = pd.read_csv('user_log_format1.csv')\n",
    "# 随机采样\n",
    "sample_fraction = 0.1  # 采样比例\n",
    "user_log = user_log.sample(frac=sample_fraction, random_state=42)\n",
    "user_log.head()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:26.317209600Z",
     "start_time": "2024-09-20T12:37:09.675593900Z"
    }
   },
   "id": "c4694284f4b666e5",
   "execution_count": 304
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "user_id           0\nitem_id           0\ncat_id            0\nseller_id         0\nbrand_id       9055\ntime_stamp        0\naction_type       0\ndtype: int64"
     },
     "execution_count": 305,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看空值数\n",
    "user_log.isnull().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:26.389427600Z",
     "start_time": "2024-09-20T12:37:26.314220100Z"
    }
   },
   "id": "9ea6d7d21dffcaef",
   "execution_count": 305
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\86166\\AppData\\Local\\Temp\\ipykernel_15384\\2838918755.py:2: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  user_info['age_range'].replace(np.nan,0.0,inplace=True)\n",
      "C:\\Users\\86166\\AppData\\Local\\Temp\\ipykernel_15384\\2838918755.py:3: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  user_info['gender'].replace(np.nan,2.0,inplace=True)\n"
     ]
    },
    {
     "data": {
      "text/plain": "   user_id  age_range  gender\n0   376517        6.0     1.0\n1   234512        5.0     0.0\n2   344532        5.0     0.0\n3   186135        5.0     0.0\n4    30230        5.0     0.0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>age_range</th>\n      <th>gender</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>376517</td>\n      <td>6.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>234512</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>344532</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>186135</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>30230</td>\n      <td>5.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 306,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 用户性别。0表示女性，1表示男性，2和NULL表示未知\n",
    "user_info['age_range'].replace(np.nan,0.0,inplace=True)\n",
    "user_info['gender'].replace(np.nan,2.0,inplace=True)\n",
    "user_info = user_info[user_info['age_range'] != 0.0]\n",
    "user_info = user_info[user_info['gender'] != 2.0]\n",
    "user_info.head()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:26.394409500Z",
     "start_time": "2024-09-20T12:37:26.361609400Z"
    }
   },
   "id": "a2b32042d456dd49",
   "execution_count": 306
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\86166\\AppData\\Local\\Temp\\ipykernel_15384\\3003646163.py:2: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
      "The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
      "\n",
      "For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
      "\n",
      "\n",
      "  user_log['brand_id'].replace(np.nan,-1,inplace=True)\n"
     ]
    },
    {
     "data": {
      "text/plain": "user_id        0\nitem_id        0\ncat_id         0\nseller_id      0\nbrand_id       0\ntime_stamp     0\naction_type    0\ndtype: int64"
     },
     "execution_count": 307,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 商品品牌的唯一编码\n",
    "user_log['brand_id'].replace(np.nan,-1,inplace=True)\n",
    "user_log = user_log[user_log['brand_id'] != -1]\n",
    "user_log.isnull().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:26.547000700Z",
     "start_time": "2024-09-20T12:37:26.378463900Z"
    }
   },
   "id": "9c18c555995c65dd",
   "execution_count": 307
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "   user_id  merchant_id  label  age_range  gender\n0   399620          310      0        3.0     1.0\n1   183656         3129      0        2.0     1.0\n2   270449          643      0        4.0     0.0\n3   234140         4073      0        6.0     0.0\n4   119065         4687      0        2.0     0.0",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n      <th>age_range</th>\n      <th>gender</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>270449</td>\n      <td>643</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>234140</td>\n      <td>4073</td>\n      <td>0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>119065</td>\n      <td>4687</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 308,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 年龄性别特征\n",
    "train_df = pd.merge(train_df,user_info,on=\"user_id\")\n",
    "train_df.head()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:26.579271200Z",
     "start_time": "2024-09-20T12:37:26.541019Z"
    }
   },
   "id": "b315b3b3d363add4",
   "execution_count": 308
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 特征衍生"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "1ab7bf3e28377856"
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "         user_id  seller_id  item_id\n0              1       2245        1\n1              1       4026        1\n2              2        420        2\n3              2       1784        1\n4              2       1974        4\n...          ...        ...      ...\n3365566   424169       3760        1\n3365567   424169       3898        1\n3365568   424169       4607        1\n3365569   424169       4731        1\n3365570   424170       3736        1\n\n[3365571 rows x 3 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>seller_id</th>\n      <th>item_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>2245</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>4026</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>420</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2</td>\n      <td>1784</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2</td>\n      <td>1974</td>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>3365566</th>\n      <td>424169</td>\n      <td>3760</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365567</th>\n      <td>424169</td>\n      <td>3898</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365568</th>\n      <td>424169</td>\n      <td>4607</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365569</th>\n      <td>424169</td>\n      <td>4731</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365570</th>\n      <td>424170</td>\n      <td>3736</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n<p>3365571 rows × 3 columns</p>\n</div>"
     },
     "execution_count": 309,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_logs_temp = user_log.groupby([user_log['user_id'], user_log['seller_id']]).count().reset_index()[['user_id','seller_id','item_id']]\n",
    "total_logs_temp"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:28.207445Z",
     "start_time": "2024-09-20T12:37:26.565318700Z"
    }
   },
   "id": "3f604ca1c8ae6667",
   "execution_count": 309
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "         user_id  merchant_id  total_logs\n0              1         2245           1\n1              1         4026           1\n2              2          420           2\n3              2         1784           1\n4              2         1974           4\n...          ...          ...         ...\n3365566   424169         3760           1\n3365567   424169         3898           1\n3365568   424169         4607           1\n3365569   424169         4731           1\n3365570   424170         3736           1\n\n[3365571 rows x 3 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>total_logs</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>2245</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>4026</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>420</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2</td>\n      <td>1784</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2</td>\n      <td>1974</td>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>3365566</th>\n      <td>424169</td>\n      <td>3760</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365567</th>\n      <td>424169</td>\n      <td>3898</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365568</th>\n      <td>424169</td>\n      <td>4607</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365569</th>\n      <td>424169</td>\n      <td>4731</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365570</th>\n      <td>424170</td>\n      <td>3736</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n<p>3365571 rows × 3 columns</p>\n</div>"
     },
     "execution_count": 310,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "total_logs_temp = total_logs_temp.rename(columns={'seller_id':'merchant_id','item_id':'total_logs'})\n",
    "total_logs_temp"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:28.273581Z",
     "start_time": "2024-09-20T12:37:28.209438600Z"
    }
   },
   "id": "fbd6946693653ce5",
   "execution_count": 310
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "       user_id  merchant_id  label  age_range  gender  total_logs\n0       399620          310      0        3.0     1.0         0.0\n1       183656         3129      0        2.0     1.0         0.0\n2       270449          643      0        4.0     0.0         1.0\n3       234140         4073      0        6.0     0.0         0.0\n4       119065         4687      0        2.0     0.0         0.0\n...        ...          ...    ...        ...     ...         ...\n39161   209619         3990      0        5.0     0.0         0.0\n39162   215442          323      1        6.0     0.0         0.0\n39163   196652          479      0        3.0     0.0         0.0\n39164   211774          685      1        4.0     0.0         1.0\n39165   337717         2630      0        4.0     0.0         0.0\n\n[39166 rows x 6 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n      <th>age_range</th>\n      <th>gender</th>\n      <th>total_logs</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>270449</td>\n      <td>643</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>234140</td>\n      <td>4073</td>\n      <td>0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>119065</td>\n      <td>4687</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>39161</th>\n      <td>209619</td>\n      <td>3990</td>\n      <td>0</td>\n      <td>5.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>39162</th>\n      <td>215442</td>\n      <td>323</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>39163</th>\n      <td>196652</td>\n      <td>479</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>39164</th>\n      <td>211774</td>\n      <td>685</td>\n      <td>1</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>39165</th>\n      <td>337717</td>\n      <td>2630</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>39166 rows × 6 columns</p>\n</div>"
     },
     "execution_count": 311,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = pd.merge(train_df,total_logs_temp,on=['user_id','merchant_id'],how='left')\n",
    "train_df['total_logs'] = train_df['total_logs'].fillna(0)\n",
    "train_df"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:28.775942900Z",
     "start_time": "2024-09-20T12:37:28.260622400Z"
    }
   },
   "id": "14cf7f279a7df9ee",
   "execution_count": 311
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "user_id        0\nitem_id        0\ncat_id         0\nmerchant_id    0\nbrand_id       0\ntime_stamp     0\naction_type    0\ndtype: int64"
     },
     "execution_count": 312,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_log.rename(columns={\"seller_id\":\"merchant_id\"},inplace=True)\n",
    "user_log.isnull().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:28.841466700Z",
     "start_time": "2024-09-20T12:37:28.775942900Z"
    }
   },
   "id": "e5e80897d8f59807",
   "execution_count": 312
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "user_id            0\n",
      "merchant_id        0\n",
      "label              0\n",
      "age_range          0\n",
      "gender             0\n",
      "total_logs         0\n",
      "item_id        19650\n",
      "cat_id         19650\n",
      "brand_id       19650\n",
      "time_stamp     19650\n",
      "action_type    19650\n",
      "dtype: int64\n"
     ]
    },
    {
     "data": {
      "text/plain": "       user_id  merchant_id  label  age_range  gender  total_logs   item_id  \\\n0       399620          310      0        3.0     1.0         0.0       NaN   \n1       183656         3129      0        2.0     1.0         0.0       NaN   \n2       270449          643      0        4.0     0.0         1.0  356147.0   \n3       234140         4073      0        6.0     0.0         0.0       NaN   \n4       119065         4687      0        2.0     0.0         0.0       NaN   \n...        ...          ...    ...        ...     ...         ...       ...   \n62996   209619         3990      0        5.0     0.0         0.0       NaN   \n62997   215442          323      1        6.0     0.0         0.0       NaN   \n62998   196652          479      0        3.0     0.0         0.0       NaN   \n62999   211774          685      1        4.0     0.0         1.0  865375.0   \n63000   337717         2630      0        4.0     0.0         0.0       NaN   \n\n       cat_id  brand_id  time_stamp  action_type  \n0         NaN       NaN         NaN          NaN  \n1         NaN       NaN         NaN          NaN  \n2      1553.0     968.0      1111.0          0.0  \n3         NaN       NaN         NaN          NaN  \n4         NaN       NaN         NaN          NaN  \n...       ...       ...         ...          ...  \n62996     NaN       NaN         NaN          NaN  \n62997     NaN       NaN         NaN          NaN  \n62998     NaN       NaN         NaN          NaN  \n62999  1252.0    6267.0      1111.0          2.0  \n63000     NaN       NaN         NaN          NaN  \n\n[63001 rows x 11 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n      <th>age_range</th>\n      <th>gender</th>\n      <th>total_logs</th>\n      <th>item_id</th>\n      <th>cat_id</th>\n      <th>brand_id</th>\n      <th>time_stamp</th>\n      <th>action_type</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>270449</td>\n      <td>643</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>356147.0</td>\n      <td>1553.0</td>\n      <td>968.0</td>\n      <td>1111.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>234140</td>\n      <td>4073</td>\n      <td>0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>119065</td>\n      <td>4687</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>62996</th>\n      <td>209619</td>\n      <td>3990</td>\n      <td>0</td>\n      <td>5.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>62997</th>\n      <td>215442</td>\n      <td>323</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>62998</th>\n      <td>196652</td>\n      <td>479</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>62999</th>\n      <td>211774</td>\n      <td>685</td>\n      <td>1</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>865375.0</td>\n      <td>1252.0</td>\n      <td>6267.0</td>\n      <td>1111.0</td>\n      <td>2.0</td>\n    </tr>\n    <tr>\n      <th>63000</th>\n      <td>337717</td>\n      <td>2630</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>NaN</td>\n    </tr>\n  </tbody>\n</table>\n<p>63001 rows × 11 columns</p>\n</div>"
     },
     "execution_count": 313,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = pd.merge(train_df,user_log,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "print(train_df.isnull().sum())\n",
    "train_df"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:37:29.637258100Z",
     "start_time": "2024-09-20T12:37:28.813556900Z"
    }
   },
   "id": "3ff6b7feb5a70246",
   "execution_count": 313
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "         user_id  merchant_id  cat_id\n0              1         2245     276\n1              1         4026    1252\n2              2          420     602\n3              2         1784     420\n4              2         1974     737\n...          ...          ...     ...\n3980814   424169         3760     662\n3980815   424169         3898     351\n3980816   424169         4607    1112\n3980817   424169         4731     351\n3980818   424170         3736     761\n\n[3980819 rows x 3 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>cat_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>2245</td>\n      <td>276</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>4026</td>\n      <td>1252</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>420</td>\n      <td>602</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2</td>\n      <td>1784</td>\n      <td>420</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2</td>\n      <td>1974</td>\n      <td>737</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>3980814</th>\n      <td>424169</td>\n      <td>3760</td>\n      <td>662</td>\n    </tr>\n    <tr>\n      <th>3980815</th>\n      <td>424169</td>\n      <td>3898</td>\n      <td>351</td>\n    </tr>\n    <tr>\n      <th>3980816</th>\n      <td>424169</td>\n      <td>4607</td>\n      <td>1112</td>\n    </tr>\n    <tr>\n      <th>3980817</th>\n      <td>424169</td>\n      <td>4731</td>\n      <td>351</td>\n    </tr>\n    <tr>\n      <th>3980818</th>\n      <td>424170</td>\n      <td>3736</td>\n      <td>761</td>\n    </tr>\n  </tbody>\n</table>\n<p>3980819 rows × 3 columns</p>\n</div>"
     },
     "execution_count": 335,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# categories特征构建\n",
    "categories_temp = user_log.groupby([user_log['user_id'], user_log['merchant_id'], user_log['cat_id']]).count().reset_index()[[\"user_id\",\"merchant_id\",\"cat_id\"]]\n",
    "categories_temp "
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:41:04.108639800Z",
     "start_time": "2024-09-20T12:41:02.280933500Z"
    }
   },
   "id": "d0a9a51770ac815e",
   "execution_count": 335
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "         user_id  merchant_id  cat_id\n0              1         2245       1\n1              1         4026       1\n2              2          420       1\n3              2         1784       1\n4              2         1974       1\n...          ...          ...     ...\n3365566   424169         3760       1\n3365567   424169         3898       1\n3365568   424169         4607       1\n3365569   424169         4731       1\n3365570   424170         3736       1\n\n[3365571 rows x 3 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>cat_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>2245</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>4026</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>420</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2</td>\n      <td>1784</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2</td>\n      <td>1974</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>3365566</th>\n      <td>424169</td>\n      <td>3760</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365567</th>\n      <td>424169</td>\n      <td>3898</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365568</th>\n      <td>424169</td>\n      <td>4607</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365569</th>\n      <td>424169</td>\n      <td>4731</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365570</th>\n      <td>424170</td>\n      <td>3736</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n<p>3365571 rows × 3 columns</p>\n</div>"
     },
     "execution_count": 336,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categories_temp1 = categories_temp.groupby([categories_temp['user_id'],categories_temp['merchant_id']]).count().reset_index()\n",
    "categories_temp1"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:54:42.532922200Z",
     "start_time": "2024-09-20T12:54:42.267130700Z"
    }
   },
   "id": "c43267ce15163ecc",
   "execution_count": 336
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "         user_id  merchant_id  categories\n0              1         2245           1\n1              1         4026           1\n2              2          420           1\n3              2         1784           1\n4              2         1974           1\n...          ...          ...         ...\n3365566   424169         3760           1\n3365567   424169         3898           1\n3365568   424169         4607           1\n3365569   424169         4731           1\n3365570   424170         3736           1\n\n[3365571 rows x 3 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>categories</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>2245</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1</td>\n      <td>4026</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>2</td>\n      <td>420</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>2</td>\n      <td>1784</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>2</td>\n      <td>1974</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>3365566</th>\n      <td>424169</td>\n      <td>3760</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365567</th>\n      <td>424169</td>\n      <td>3898</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365568</th>\n      <td>424169</td>\n      <td>4607</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365569</th>\n      <td>424169</td>\n      <td>4731</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>3365570</th>\n      <td>424170</td>\n      <td>3736</td>\n      <td>1</td>\n    </tr>\n  </tbody>\n</table>\n<p>3365571 rows × 3 columns</p>\n</div>"
     },
     "execution_count": 337,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categories_temp1.rename(columns={'cat_id':'categories'},inplace=True)\n",
    "categories_temp1"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:56:18.473631300Z",
     "start_time": "2024-09-20T12:56:18.466832300Z"
    }
   },
   "id": "dddf827d3a818e4a",
   "execution_count": 337
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "       user_id  merchant_id  label  age_range  gender  total_logs   item_id  \\\n0       399620          310      0        3.0     1.0         0.0       0.0   \n1       183656         3129      0        2.0     1.0         0.0       0.0   \n2       270449          643      0        4.0     0.0         1.0  356147.0   \n3       234140         4073      0        6.0     0.0         0.0       0.0   \n4       119065         4687      0        2.0     0.0         0.0       0.0   \n...        ...          ...    ...        ...     ...         ...       ...   \n62996   209619         3990      0        5.0     0.0         0.0       0.0   \n62997   215442          323      1        6.0     0.0         0.0       0.0   \n62998   196652          479      0        3.0     0.0         0.0       0.0   \n62999   211774          685      1        4.0     0.0         1.0  865375.0   \n63000   337717         2630      0        4.0     0.0         0.0       0.0   \n\n       cat_id  brand_id  time_stamp  action_type  categories  \n0         0.0       0.0         0.0          0.0         NaN  \n1         0.0       0.0         0.0          0.0         NaN  \n2      1553.0     968.0      1111.0          0.0         1.0  \n3         0.0       0.0         0.0          0.0         NaN  \n4         0.0       0.0         0.0          0.0         NaN  \n...       ...       ...         ...          ...         ...  \n62996     0.0       0.0         0.0          0.0         NaN  \n62997     0.0       0.0         0.0          0.0         NaN  \n62998     0.0       0.0         0.0          0.0         NaN  \n62999  1252.0    6267.0      1111.0          2.0         1.0  \n63000     0.0       0.0         0.0          0.0         NaN  \n\n[63001 rows x 12 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n      <th>age_range</th>\n      <th>gender</th>\n      <th>total_logs</th>\n      <th>item_id</th>\n      <th>cat_id</th>\n      <th>brand_id</th>\n      <th>time_stamp</th>\n      <th>action_type</th>\n      <th>categories</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>270449</td>\n      <td>643</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>356147.0</td>\n      <td>1553.0</td>\n      <td>968.0</td>\n      <td>1111.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>234140</td>\n      <td>4073</td>\n      <td>0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>119065</td>\n      <td>4687</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>62996</th>\n      <td>209619</td>\n      <td>3990</td>\n      <td>0</td>\n      <td>5.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>62997</th>\n      <td>215442</td>\n      <td>323</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>62998</th>\n      <td>196652</td>\n      <td>479</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n    <tr>\n      <th>62999</th>\n      <td>211774</td>\n      <td>685</td>\n      <td>1</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>865375.0</td>\n      <td>1252.0</td>\n      <td>6267.0</td>\n      <td>1111.0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>63000</th>\n      <td>337717</td>\n      <td>2630</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>NaN</td>\n    </tr>\n  </tbody>\n</table>\n<p>63001 rows × 12 columns</p>\n</div>"
     },
     "execution_count": 338,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df = pd.merge(train_df,categories_temp1,on=[\"user_id\",\"merchant_id\"],how=\"left\")\n",
    "train_df"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:58:53.137391400Z",
     "start_time": "2024-09-20T12:58:52.595660100Z"
    }
   },
   "id": "bc77e1d0b6844473",
   "execution_count": 338
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 空值处理"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "d0f2bbf6e8dede7e"
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "       user_id  merchant_id  label  age_range  gender  total_logs   item_id  \\\n0       399620          310      0        3.0     1.0         0.0       0.0   \n1       183656         3129      0        2.0     1.0         0.0       0.0   \n2       270449          643      0        4.0     0.0         1.0  356147.0   \n3       234140         4073      0        6.0     0.0         0.0       0.0   \n4       119065         4687      0        2.0     0.0         0.0       0.0   \n...        ...          ...    ...        ...     ...         ...       ...   \n62996   209619         3990      0        5.0     0.0         0.0       0.0   \n62997   215442          323      1        6.0     0.0         0.0       0.0   \n62998   196652          479      0        3.0     0.0         0.0       0.0   \n62999   211774          685      1        4.0     0.0         1.0  865375.0   \n63000   337717         2630      0        4.0     0.0         0.0       0.0   \n\n       cat_id  brand_id  time_stamp  action_type  categories  \n0         0.0       0.0         0.0          0.0         0.0  \n1         0.0       0.0         0.0          0.0         0.0  \n2      1553.0     968.0      1111.0          0.0         1.0  \n3         0.0       0.0         0.0          0.0         0.0  \n4         0.0       0.0         0.0          0.0         0.0  \n...       ...       ...         ...          ...         ...  \n62996     0.0       0.0         0.0          0.0         0.0  \n62997     0.0       0.0         0.0          0.0         0.0  \n62998     0.0       0.0         0.0          0.0         0.0  \n62999  1252.0    6267.0      1111.0          2.0         1.0  \n63000     0.0       0.0         0.0          0.0         0.0  \n\n[63001 rows x 12 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n      <th>age_range</th>\n      <th>gender</th>\n      <th>total_logs</th>\n      <th>item_id</th>\n      <th>cat_id</th>\n      <th>brand_id</th>\n      <th>time_stamp</th>\n      <th>action_type</th>\n      <th>categories</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>270449</td>\n      <td>643</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>356147.0</td>\n      <td>1553.0</td>\n      <td>968.0</td>\n      <td>1111.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>234140</td>\n      <td>4073</td>\n      <td>0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>119065</td>\n      <td>4687</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>62996</th>\n      <td>209619</td>\n      <td>3990</td>\n      <td>0</td>\n      <td>5.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>62997</th>\n      <td>215442</td>\n      <td>323</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>62998</th>\n      <td>196652</td>\n      <td>479</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>62999</th>\n      <td>211774</td>\n      <td>685</td>\n      <td>1</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>865375.0</td>\n      <td>1252.0</td>\n      <td>6267.0</td>\n      <td>1111.0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>63000</th>\n      <td>337717</td>\n      <td>2630</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>63001 rows × 12 columns</p>\n</div>"
     },
     "execution_count": 339,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# train_df['item_id'] = train_df['item_id'].fillna(train_df['item_id'].mean())\n",
    "# train_df['cat_id'] = train_df['cat_id'].fillna(train_df['cat_id'].mean())\n",
    "# train_df['brand_id'] = train_df['brand_id'].fillna(train_df['brand_id'].mean())\n",
    "# train_df['time_stamp'] = train_df['time_stamp'].fillna(train_df['time_stamp'].mean())\n",
    "# train_df['action_type'] = train_df['action_type'].fillna(0)\n",
    "\n",
    "train_df = train_df.fillna(0)\n",
    "train_df"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:41.076570600Z",
     "start_time": "2024-09-20T12:59:41.051742300Z"
    }
   },
   "id": "4020e14774cfced",
   "execution_count": 339
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "3899"
     },
     "execution_count": 340,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看重复值个数\n",
    "train_df.duplicated().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:45.135185600Z",
     "start_time": "2024-09-20T12:59:45.107861600Z"
    }
   },
   "id": "6e32875f77ce402f",
   "execution_count": 340
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "       user_id  merchant_id  label  age_range  gender  total_logs   item_id  \\\n0       399620          310      0        3.0     1.0         0.0       0.0   \n1       183656         3129      0        2.0     1.0         0.0       0.0   \n2       270449          643      0        4.0     0.0         1.0  356147.0   \n3       234140         4073      0        6.0     0.0         0.0       0.0   \n4       119065         4687      0        2.0     0.0         0.0       0.0   \n...        ...          ...    ...        ...     ...         ...       ...   \n62996   209619         3990      0        5.0     0.0         0.0       0.0   \n62997   215442          323      1        6.0     0.0         0.0       0.0   \n62998   196652          479      0        3.0     0.0         0.0       0.0   \n62999   211774          685      1        4.0     0.0         1.0  865375.0   \n63000   337717         2630      0        4.0     0.0         0.0       0.0   \n\n       cat_id  brand_id  time_stamp  action_type  categories  \n0         0.0       0.0         0.0          0.0         0.0  \n1         0.0       0.0         0.0          0.0         0.0  \n2      1553.0     968.0      1111.0          0.0         1.0  \n3         0.0       0.0         0.0          0.0         0.0  \n4         0.0       0.0         0.0          0.0         0.0  \n...       ...       ...         ...          ...         ...  \n62996     0.0       0.0         0.0          0.0         0.0  \n62997     0.0       0.0         0.0          0.0         0.0  \n62998     0.0       0.0         0.0          0.0         0.0  \n62999  1252.0    6267.0      1111.0          2.0         1.0  \n63000     0.0       0.0         0.0          0.0         0.0  \n\n[59102 rows x 12 columns]",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>user_id</th>\n      <th>merchant_id</th>\n      <th>label</th>\n      <th>age_range</th>\n      <th>gender</th>\n      <th>total_logs</th>\n      <th>item_id</th>\n      <th>cat_id</th>\n      <th>brand_id</th>\n      <th>time_stamp</th>\n      <th>action_type</th>\n      <th>categories</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>399620</td>\n      <td>310</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>183656</td>\n      <td>3129</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>270449</td>\n      <td>643</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>356147.0</td>\n      <td>1553.0</td>\n      <td>968.0</td>\n      <td>1111.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>234140</td>\n      <td>4073</td>\n      <td>0</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>119065</td>\n      <td>4687</td>\n      <td>0</td>\n      <td>2.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>62996</th>\n      <td>209619</td>\n      <td>3990</td>\n      <td>0</td>\n      <td>5.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>62997</th>\n      <td>215442</td>\n      <td>323</td>\n      <td>1</td>\n      <td>6.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>62998</th>\n      <td>196652</td>\n      <td>479</td>\n      <td>0</td>\n      <td>3.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n    <tr>\n      <th>62999</th>\n      <td>211774</td>\n      <td>685</td>\n      <td>1</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>1.0</td>\n      <td>865375.0</td>\n      <td>1252.0</td>\n      <td>6267.0</td>\n      <td>1111.0</td>\n      <td>2.0</td>\n      <td>1.0</td>\n    </tr>\n    <tr>\n      <th>63000</th>\n      <td>337717</td>\n      <td>2630</td>\n      <td>0</td>\n      <td>4.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>0.0</td>\n    </tr>\n  </tbody>\n</table>\n<p>59102 rows × 12 columns</p>\n</div>"
     },
     "execution_count": 341,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除重复值\n",
    "train_df.drop_duplicates()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:46.364431Z",
     "start_time": "2024-09-20T12:59:46.332914200Z"
    }
   },
   "id": "cb1ceb19b8c69a6e",
   "execution_count": 341
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "X = train_df.drop(['user_id','merchant_id','label'],axis=1)\n",
    "y = train_df['label']"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:48.302057600Z",
     "start_time": "2024-09-20T12:59:48.295107800Z"
    }
   },
   "id": "b9fbdc23e935a73b",
   "execution_count": 342
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:49.983495700Z",
     "start_time": "2024-09-20T12:59:49.969298800Z"
    }
   },
   "id": "1d15ba6d205653d5",
   "execution_count": 343
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 1 ... 0 0 0]\n",
      "[1 1 0 ... 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn2pmml import sklearn2pmml\n",
    "\n",
    "# todo 决策树分类\n",
    "dt_model = DecisionTreeClassifier() # todo splitter=\"best\" splitter也是用来控制决策树中的随机选项的，有两种输入值，输入”best\"，决策树在分枝时虽然随机，但是还是会优先选择更重要的特征进行分枝（重要性可以通过属性 feature_importances_ 查看），输入“random\"，决策树在分枝时会更加随机，树会因为含有更多的不必要信息而更深更大，并因这些不必要信息而降低对训练集的拟合。\n",
    "dt_model.fit(X_train, y_train)\n",
    "\n",
    "# sklearn2pmml(dt_model,'dt_model.pmml')\n",
    "\n",
    "#测试\n",
    "y_pred_test = dt_model.predict(X_test)\n",
    "print(y_pred_test)\n",
    "# 训练\n",
    "y_pred_train = dt_model.predict(X_train)\n",
    "print(y_pred_train)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:51.641779Z",
     "start_time": "2024-09-20T12:59:51.498221800Z"
    }
   },
   "id": "2b4f8c2767da205",
   "execution_count": 344
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "模型的评估报告：\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.95      0.96      0.96     19123\n",
      "           1       0.49      0.45      0.47      1668\n",
      "\n",
      "    accuracy                           0.92     20791\n",
      "   macro avg       0.72      0.70      0.71     20791\n",
      "weighted avg       0.92      0.92      0.92     20791\n",
      "\n",
      "模型的评估报告：\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       0.98      1.00      0.99     38767\n",
      "           1       1.00      0.80      0.89      3443\n",
      "\n",
      "    accuracy                           0.98     42210\n",
      "   macro avg       0.99      0.90      0.94     42210\n",
      "weighted avg       0.98      0.98      0.98     42210\n"
     ]
    }
   ],
   "source": [
    "from sklearn import metrics as mcs\n",
    "\n",
    "print(\"模型的评估报告：\\n\",mcs.classification_report(y_test, y_pred_test))\n",
    "print(\"模型的评估报告：\\n\",mcs.classification_report(y_train, y_pred_train))"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:53.272866600Z",
     "start_time": "2024-09-20T12:59:53.226410300Z"
    }
   },
   "id": "a105536965e8168d",
   "execution_count": 345
  },
  {
   "cell_type": "markdown",
   "source": [
    "从这个评估报告可以看出，模型在类别 0 上表现良好，而在类别 1 上表现较差。类别 1 的精确率和召回率都很低，这可能是由于类别 1 在数据集中较少，导致模型难以学习到其特征。此外，模型的整体准确率较高，但由于类别不平衡，加权平均的精确率、召回率和 F1分数都反映了类别 0 的高支持数对整体性能的影响。"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "79548186f8f30e73"
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集： 0.7045182919710354\n"
     ]
    }
   ],
   "source": [
    "# 测试集\n",
    "roc_test = mcs.roc_auc_score(y_test,y_pred_test)\n",
    "print(\"测试集：\",roc_test)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:55.324771800Z",
     "start_time": "2024-09-20T12:59:55.318813400Z"
    }
   },
   "id": "a8b4c0ff3ff21261",
   "execution_count": 346
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集： 0.8978701077621547\n"
     ]
    }
   ],
   "source": [
    "# 训练集\n",
    "roc_train = mcs.roc_auc_score(y_train,y_pred_train)\n",
    "print(\"训练集：\",roc_train)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:57.514478Z",
     "start_time": "2024-09-20T12:59:57.499600400Z"
    }
   },
   "id": "7d667b428d480e3a",
   "execution_count": 347
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "test_df = pd.read_csv('test_format1.csv')\n",
    "test_proba = dt_model.predict_proba(X_test)[:,1]\n",
    "test_df['prob'] = pd.Series(test_proba)\n",
    "test_df.to_csv('proba.csv')"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:59:59.431230700Z",
     "start_time": "2024-09-20T12:59:59.182053100Z"
    }
   },
   "id": "50f3facfdeca2c86",
   "execution_count": 348
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import RocCurveDisplay\n",
    "# 用于显示 ROC 曲线\n",
    "RocCurveDisplay.from_estimator(dt_model, X_test, y_test) \n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T13:00:00.533308600Z",
     "start_time": "2024-09-20T13:00:00.462929100Z"
    }
   },
   "id": "6d2e0240e00f1ee9",
   "execution_count": 349
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 ... 0 0 0]\n",
      "[0 0 0 ... 0 0 0]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py:547: FitFailedWarning: \n",
      "30 fits failed out of a total of 60.\n",
      "The score on these train-test partitions for these parameters will be set to nan.\n",
      "If these failures are not expected, you can try to debug them by setting error_score='raise'.\n",
      "\n",
      "Below are more details about the failures:\n",
      "--------------------------------------------------------------------------------\n",
      "30 fits failed with the following error:\n",
      "Traceback (most recent call last):\n",
      "  File \"D:\\anaconda\\Lib\\site-packages\\sklearn\\model_selection\\_validation.py\", line 895, in _fit_and_score\n",
      "    estimator.fit(X_train, y_train, **fit_params)\n",
      "  File \"D:\\anaconda\\Lib\\site-packages\\sklearn\\base.py\", line 1467, in wrapper\n",
      "    estimator._validate_params()\n",
      "  File \"D:\\anaconda\\Lib\\site-packages\\sklearn\\base.py\", line 666, in _validate_params\n",
      "    validate_parameter_constraints(\n",
      "  File \"D:\\anaconda\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py\", line 95, in validate_parameter_constraints\n",
      "    raise InvalidParameterError(\n",
      "sklearn.utils._param_validation.InvalidParameterError: The 'max_features' parameter of DecisionTreeClassifier must be an int in the range [1, inf), a float in the range (0.0, 1.0], a str among {'sqrt', 'log2'} or None. Got 'auto' instead.\n",
      "\n",
      "  warnings.warn(some_fits_failed_message, FitFailedWarning)\n",
      "D:\\anaconda\\Lib\\site-packages\\sklearn\\model_selection\\_search.py:1051: UserWarning: One or more of the test scores are non-finite: [       nan 0.92364369        nan 0.92319356        nan 0.91911869\n",
      "        nan 0.92217484        nan 0.92279081        nan 0.91914238]\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "parameters = {\n",
    "    'criterion':['gini', 'entropy'], #熵越高，分类的不确定性越大\n",
    "    'max_features':['auto', 'log2'],\n",
    "    'max_depth':[10, 8, 5]\n",
    "}\n",
    "cv = GridSearchCV(dt_model, parameters,cv=5,scoring='accuracy')\n",
    "cv.fit(X_train, y_train)\n",
    "# 最佳模型\n",
    "best_clt = cv.best_estimator_\n",
    "best_clt.fit(X_train, y_train)\n",
    "\n",
    "# 测试集 \n",
    "cv_pred_test = best_clt.predict(X_test)\n",
    "print(cv_pred_test)\n",
    "# 训练集\n",
    "cv_pred_train = best_clt.predict(X_train)\n",
    "print(cv_pred_train)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T13:00:03.401033800Z",
     "start_time": "2024-09-20T13:00:02.552787500Z"
    }
   },
   "id": "7d3903bfa0a49b39",
   "execution_count": 350
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集： 0.558135779720103\n",
      "训练集： 0.5671996794660409\n"
     ]
    }
   ],
   "source": [
    "# 测试集\n",
    "cv_roc_test = mcs.roc_auc_score(y_test,cv_pred_test)\n",
    "print(\"测试集：\",cv_roc_test)\n",
    "\n",
    "# 训练集\n",
    "cv_roc_train = mcs.roc_auc_score(y_train,cv_pred_train)\n",
    "print(\"训练集：\",cv_roc_train)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T13:00:06.069823800Z",
     "start_time": "2024-09-20T13:00:06.054434300Z"
    }
   },
   "id": "f6590ebe0d1b9c73",
   "execution_count": 351
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "RocCurveDisplay.from_estimator(best_clt, X_test, y_test)\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T13:00:08.106663400Z",
     "start_time": "2024-09-20T13:00:08.034296900Z"
    }
   },
   "id": "d3cc5a0d07ca44c2",
   "execution_count": 352
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-20T12:31:31.334104900Z",
     "start_time": "2024-09-20T12:31:31.328117600Z"
    }
   },
   "id": "de968507898b4904",
   "execution_count": 273
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
